9. 回文数
9. 回文数
Similar Question
leading to the advanced question
564. 寻找最近的回文数 题解 - 力扣(LeetCode)
Solution Tips
由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除
反转整个数再进行判断也可以,而且代码更简洁,因为如果反转溢出,那他一定不是回文数,回文数反转以后一定是它本身,所以一定不会溢出
方案一: 数学
- 将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。 但是,如果反转后的数字大于
int.MAX
,我们将遇到整数溢出问题。 - 为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。
- 首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为
-
不等于3
。所以我们可以对所有负数返回 false。 - 现在,让我们来考虑如何反转后半部分的数字。 对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。
- 现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?
- 我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。
var isPalindrome = function(x: number): boolean {
// 特殊情况:
// 如上所述,当 x < 0 时,x 不是回文数。
// 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// 则其第一位数字也应该是 0
// 只有 0 满足这一属性
if (x < 0 || (x % 10 === 0 && x !== 0)) {
return false;
}
let revertedNumber: number = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x = Math.floor(x / 10);
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x === revertedNumber || x === Math.floor(revertedNumber / 10);
};
方案二: 转换为字符串 + 反转一半
var isPalindrome = function(x) {
const str = x+''
// 反转一半,无法搞定小于1的情况
if(str.length<=1) return true
const half = str.length>>>1
const partOne = str.slice(0,half)
const partTwo = str.slice(-half).split('').reverse().join('')
return partOne === partTwo
}
头尾比对
var isPalindrome = function(x) {
const str = x+""
const len =str.length
for(let i=0;i<len>>>1;i++){
if(str[i] !== str[len-1-i]) return false
}
return true
}
var isPalindrome = function(x) {
const str = x+""
const arr = [...str]
const half = arr.length>>>1
// 不可以在内部length,因为一边 shift和pop,length一直在改变
for(let i=0;i<half;i++){
if(arr.shift()!==arr.pop()) return false
}
return arr.length<=1
}
let x = 1001
console.log(isPalindrome(x))
- 性能最好,空间换时间